package com.company.bookstore.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.Collections;

/**
 * SwaggerConfiguration
 * https://developer.ibm.com/zh/articles/j-using-swagger-in-a-spring-boot-project/
 *
 *
 * 自定义响应消息
 * Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息，
 * 但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息，
 * 假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息，我们只需要在 SwaggerConfig.java 类中的 Docket Bean 下添加如下内容：
 *
 * 清单 12. 自定义响应消息
 *
 * .useDefaultResponseMessages(false)
 * .globalResponseMessage(RequestMethod.GET, newArrayList(
 * new ResponseMessageBuilder()
 *               .code(500)
 *               .message("服务器发生异常")
 *               .responseModel(new ModelRef("Error"))
 *               .build(),
 *        new ResponseMessageBuilder()
 *               .code(403)
 *               .message("资源不可用")
 *               .build()
 * ));
 *
 * 接口过滤
 * .apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller"))
 * .paths(Predicates.or(PathSelectors.ant("/user/add"),
 *         PathSelectors.ant("/user/find/*")))
 *
 *
 * Springfox 提供了一个 Docket 对象，让我们可以灵活的配置 Swagger 的各项属性。下面我们新建一个 cn.itweknow.sbswagger.conf.SwaggerConfig.java 类，并增加如下内容:
 *
 *
 *
 * @blame Android Team
 */
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()  //选择对哪些路径和API监控
                .apis(RequestHandlerSelectors.any()) //对所有API进行监控
                .paths(PathSelectors.any())  //对所有的路径进行监控

                .build()
                .apiInfo(apiInfo());
    }
    private ApiInfo apiInfo() {
        return new ApiInfo(
                "网上书城 项目集成 Swagger 实例文档",
                " 这里是描述 ",
                "API V1.0",
                "Terms of service",
                new Contact("名字想好没", "https://itweknow.cn", "gancy.programmer@gmail.com"),
                "Apache", "http://www.apache.org/", Collections.emptyList());
    }
}